package com.gao.g_aio.server;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

/**
 * @author gaopeng
 * @time 2020/10/02 10:54:33
 */
public class AcceptorCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsyncTimeServerHandler> {
    @Override
    public void completed(AsynchronousSocketChannel result, AsyncTimeServerHandler attachment) {
        /*
            从attachment中获取成员变量AsynchronousServerSocketChannel，有的读者可能会心存疑惑：既然已经接收客户端成功了，
            为什么还要再次调用accept方法呢？原因是这样的：调用AsynchronousServerSocketChannel的accept方法后，如果有新的
            客户端接入，系统将回调我们传入的CompletionHandler实例的completed方法，表示新的客户端已经接入成功。

            因为一个AsynchronousServerSocketChannel可以接收成千上万个客户端，所以需要继续调用它的accept方法，接收其他的客
            户端连接，最终形成一个循环。每当接收一个客户读取连接成功之后，再异步接收新的客户端连接。
         */
        attachment.asynchronousServerSocketChannel.accept(attachment, this);

        ByteBuffer buffer = ByteBuffer.allocate(1024);
        result.read(buffer, buffer, new ReadCompletionHandler(result));
    }

    @Override
    public void failed(Throwable exc, AsyncTimeServerHandler attachment) {
        attachment.latch.countDown();
    }
}
